//自定参数校验逻辑
const validator = require("./Errback");
const { User } = require("../../model");
const { body } = require("express-validator"); // body获取post参数

//用户注册参数校验
// .bail()结束当前语句判断继续下一个
// api参考:🔗:https://express-validator.github.io/docs/

//注册参数校验
module.exports.register = validator([
    body('username').notEmpty().withMessage('用户名不能为空!').bail()
    .isLength({min:3}).withMessage('用户名至少三位').bail()
    .custom(async val=>{
        const usernameValidator = await User.findOne({username:val})
        if(usernameValidator){
            return Promise.reject('用户名已经存在')
        }
    }).bail(),

    body('email').notEmpty().withMessage('邮箱不能为空!').bail()
    .isEmail().withMessage('邮箱格式不正确').bail()
    .custom(async val=>{
        const emailValidator = await User.findOne({email:val})
        if(emailValidator){
            return Promise.reject('邮箱已经存在')
        }
    }).bail(),

    body('phone').notEmpty().withMessage('手机号码不能为空!').bail()
    .isLength({min:11}).withMessage('手机号至11位').bail()
    .custom(async val=>{
        const phoneValidator = await User.findOne({phone:val})
        if(phoneValidator){
            return Promise.reject('手机号码已经存在')
        }
    }).bail(),
    body('password').notEmpty().withMessage('密码不能为空!').bail()
    .isLength({min:5}).withMessage('密码至少五位').bail()
])

//登录参数校验
// 校验邮箱和密码进行提示
module.exports.login = validator([
    body('email').notEmpty().withMessage('邮箱不能为空!').bail()
    .isEmail().withMessage('邮箱格式不正确').bail()
    .custom(async val=>{
        const emailValidator = await User.findOne({email:val})
        if(!emailValidator){
            return Promise.reject('邮箱暂未注册!')
        }
    }).bail(),
    body('password').notEmpty().withMessage('密码不能为空!').bail()
])

//更新用户信息校验
// 邮箱 用户名 手机号码 
module.exports.update = validator([
    body('email').notEmpty().withMessage('邮箱不能为空!').bail()
    .isEmail().withMessage('邮箱格式不正确').bail()
    .custom(async val=>{
        const emailValidator = await User.findOne({email:val})
        if(emailValidator){
            return Promise.reject('邮箱已经存在!')
        }
    }).bail(),
    body('username').notEmpty().withMessage('用户名不能为空!').bail()
    .isLength({min:3}).withMessage('用户名至少三位').bail()
    .custom(async val=>{
        const usernameValidator = await User.findOne({username:val})
        if(usernameValidator){
            return Promise.reject('用户名已经存在!')
        }
    }).bail(),
    body('phone').notEmpty().withMessage('手机号码不能为空!').bail()
    .isLength({min:11}).withMessage('手机号码最少11位').bail()
    .custom(async val=>{
        const phoneValidator = await User.findOne({phone:val})
        if(phoneValidator){
            return Promise.reject('手机号码已经存在!')
        }
    }).bail()
])